//通过SCCB接口配置摄像头工作模式
//通过MDIO接口配置以太网卡PHY芯片工作模式
//通过DVP接口接收摄像头数据
//通过FIFO缓存图像数据（跨时钟寄存数据）
//通过GMII接口转RGMII接口模块将数据发送到以太网卡PHY芯片
//以太网卡通过RGMII<->RJ45转换芯片将图像数据通过RJ45物理线缆传输出去
//目标设备接收以太网帧，并解封装解析图像数据进而进行显示
module ov5640_udp_rgmii(
	clk			,
	rst_n			,
	
	ETH_RESET_N	,
	ETH_GTX_CLK	,
	ETH_TX_DATA ,
	ETH_TX_EN	,
	ETH_MDC		,
	ETH_MDIO		,
	
	Camera_sclk	,
	Camera_sdat	,
	Camera_vsync,
	Camera_href	,
	Camera_pclk	,
	Camera_xclk	,
	Camera_data	,
	Camera_rst_n,
	Camera_pwdn	,
	led_camera_init_done,
	led_locked 
);

	input 		clk;
	input 		rst_n;
	output 		ETH_RESET_N;
	output 		ETH_GTX_CLK;
	output [3:0]ETH_TX_DATA;
	output 		ETH_TX_EN;
	
	output 		ETH_MDC;
	inout 		ETH_MDIO;

	output 		Camera_sclk;
	inout 		Camera_sdat;
	input 		Camera_vsync;
	input 		Camera_href ;
	input 		Camera_pclk ;
	output 		Camera_xclk;
	input [7:0] Camera_data;
	output 		Camera_rst_n;
	output 		Camera_pwdn;
	output 		led_camera_init_done;
	output      led_locked;
	

	wire GMII_GTXC;
	wire [7:0] GMII_TXD;
	wire GMII_TXEN;
	wire clk_125m;
	wire clk_24m;
	wire [7:0]fifo_wrdata;
	wire fifo_wrreq;
	wire [12:0]fifo_usedw;
	wire locked;
	wire global_rst_n;
	assign global_rst_n = locked;
	
	assign Camera_xclk = clk_24m;
	assign GMII_GTXC = clk_125m;
//	assign ETH_RESET_N = 1;
	assign led_locked = locked?1'b0:1'b1;
	//GMII接口转RGMII 板载的网卡PHY芯片仅支持RGMII接口
	gmii_to_rgmii	gmii_to_rgmii_inst(
		.gmii_gtxc(GMII_GTXC),
		.gmii_txd(GMII_TXD),
		.gmii_txen(GMII_TXEN),
		.rgmii_gtxc(ETH_GTX_CLK),
		.rgmii_txd(ETH_TX_DATA),
		.rgmii_txen(ETH_TX_EN)
	);
	
		
	pll 	pll(
		.areset(!rst_n),
		.inclk0(clk),
		.c0(clk_125m),
		.c1(clk_24m),
		.locked(locked)
	);

	
	wire phy_init;

	 phy_reg_config#(   //配置以太网卡PHY芯片的工作模式
		  .speed (2'b10), //10为千兆，01为百兆，00为十兆
		  .SYS_CLOCK (50_000_000),		//系统时钟采用50MHz
		  .MDC_CLOCK (2_000),	//MDC总线时钟采用2kHz
		  .MAX_CNT (2) //要配置的寄存器个数
	)phy_reg_config_inst
	(
		.clk(clk),
		.rst_n(global_rst_n),
		.phy_rst_n(ETH_RESET_N),
		.rddata(),
		.phy_init_done(phy_init),
		.mdc(ETH_MDC),
		.mdio(ETH_MDIO)
	);
	
	localparam RGB = 0;
	localparam JPEG = 1;
	
	parameter IMAGE_WIDTH  = 1280; //图片宽度
	parameter IMAGE_HEIGHT = 720; //图片高度(≤720)
	parameter IMAGE_FLIP   = 0;   //0：不翻转，1：上下翻转
	parameter IMAGE_MIRROR = 0;   //0：不镜像，1：左右镜像
	//摄像头初始化配置
	wire Init_Done;
	wire fifo_aclr;
	Camera_Init
	#(
		.IMAGE_TYPE(RGB),
		.IMAGE_WIDTH(IMAGE_WIDTH),
		.IMAGE_HEIGHT(IMAGE_HEIGHT),
		.IMAGE_FLIP(IMAGE_FLIP),
		.IMAGE_MIRROR(IMAGE_MIRROR)
	)
	Camera_Init(
		.clk(clk),
		.rst_n(rst_n),
		.init_done(Init_Done),
		.camera_rst_n(Camera_rst_n),
		.camera_pwdn(Camera_pwdn),
		.i2c_sclk(Camera_sclk),
		.i2c_sdat(Camera_sdat),
		.led_camera_init(led_camera_init_done)
	);
	
	Camera_ETH_Formator	Camera_ETH_Formator(
		.Rst_n	(rst_n),
		.PCLK		(Camera_pclk),
		.Init_Done(Init_Done),
		.HREF		(Camera_href),
		.VSYNC	(Camera_vsync),
		.DATA		(Camera_data),
		.fifo_aclr(fifo_aclr	),
		.wrdata	(fifo_wrdata),
		.wrreq	(fifo_wrreq)		
	);

	UDP_Send UDP_Send_inst(
		.CLK				(),
		.Rst_n			(Init_Done),
		.Tx_Done			(),
		.des_mac			(48'hFF_FF_FF_FF_FF_FF),
		.src_mac			(48'h00_07_ed_ac_62_00),
		.des_port		(16'd6102),
		.src_port		(16'd5000),
		.des_ip			(32'hc0_a8_00_03),
		.src_ip			(32'hc0_a8_00_02),
		.data_length	(1280*2+2),  //加上两个字节的行号
		.GMII_GTXC		(GMII_GTXC),
		.GMII_TXD		(GMII_TXD),
		.GMII_TXEN		(GMII_TXEN),	
		.wrreq			(fifo_wrreq),
		.wrdata			(fifo_wrdata),
		.wrclk			(Camera_pclk),
		.aclr				(fifo_aclr),
		.wrusedw			(fifo_usedw)		
	);
	

endmodule  